home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2007 June
/
PCWorld_2007-06_cd.bin
/
v cisle
/
tclock
/
tclocklight-040702-3.exe
/
source
/
exe
/
command.c
< prev
next >
Wrap
C/C++ Source or Header
|
2004-07-01
|
9KB
|
342 lines
/*-------------------------------------------------------------
command.c : process WM_COMMAND message
(C) 1997-2003 Kazuto Sato
Please read readme.txt about the license.
Written by Kazubon, Nanashi-san
---------------------------------------------------------------*/
#include "tclock.h"
#include "../common/command.h"
/* Globals */
void OnTClockCommand(HWND hwnd, int id, int code);
BOOL ExecCommandString(HWND hwnd, const char *command);
void CopyToClipBoard(HWND hwnd, const char *pfmt);
/* Statics */
typedef struct{
BYTE key;
DWORD flag;
} KEYEVENT, *LPKEYEVENT;
static void ShowHelp(HWND hwnd);
static void PostMessageCommand(const char *option);
static void ExecHiddenCmdPrompt(HWND hwnd, const char *str);
static BOOL CALLBACK doKyu(HWND hwnd, long height);
static void PushKeybd(LPKEYEVENT lpkey);
/*------------------------------------------------
WM_COMMAND message
--------------------------------------------------*/
void OnTClockCommand(HWND hwnd, int id, int code)
{
switch(id)
{
case IDC_SHOWHELP: // Help
ShowHelp(hwnd);
break;
case IDC_SHOWPROP: // Property
ExecFile(hwnd, "tcprop.exe");
break;
case IDC_EXIT: // Exit
PostMessage(g_hwndClock, CLOCKM_EXIT, 0, 0);
break;
case IDC_TIMER:
ExecFile(hwnd, "tctimer.exe");
break;
case IDC_SYNCTIME: // Syncronize time
ExecFile(hwnd, "tcsntp.exe /silent");
// StartSyncTime(hwnd, NULL, 0, FALSE);
break;
case IDC_ABOUT: // About TClock
ShowAboutBox(hwnd); // about.c
break;
case IDC_COPYCLIP: // copy to clipboard
PostMessage(g_hwndClock, CLOCKM_COPY, 0, 0);
break;
case IDC_REFRESHCLOCK: // Refresh clock
PostMessage(g_hwndClock, CLOCKM_REFRESHCLOCK, 0, 0);
break;
case IDC_DELUS: // clear user strings
PostMessage(g_hwndClock, CLOCKM_DELUSRSTR, 0, 0);
PostMessage(g_hwndClock, CLOCKM_REFRESHCLOCK, 0, 0);
break;
case IDC_TCLOCKMENU: // context menu
{
POINT pt;
GetCursorPos(&pt);
OnContextMenu(hwnd, NULL, pt.x, pt.y);
break;
}
case IDC_SCREENSAVER: // screen saver
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0);
break;
case IDC_SHOWDESK: // show desktop
{
KEYEVENT key[]={
{VK_LWIN, 0}, // Windows key down
{'D', 0}, // D key down
{'D', KEYEVENTF_KEYUP}, // D key up
{VK_LWIN, KEYEVENTF_KEYUP}, // Windows key up
{0xff, 0}, };
PushKeybd(key);
break;
}
case IDC_KYU: // kyu!
{
RECT rc;
GetWindowRect(GetTaskbarWindow(), &rc);
if(rc.bottom < GetSystemMetrics(SM_CYSCREEN))
EnumWindows(doKyu, rc.bottom);
break;
}
case IDC_DELRECDOCS: // delete recently used documents
SHAddToRecentDocs(SHARD_PATH, NULL);
break;
case IDC_SHOWSTARTMENU: // open start menu
{
KEYEVENT key[] = {
{ VK_LWIN, 0 }, // Win key down
{ VK_LWIN, KEYEVENTF_KEYUP }, // Win key up
{ 0xff,0 },
};
PushKeybd(key);
break;
}
case IDC_TASKSW: // switch tasks
{
KEYEVENT key[] = {
{ VK_MENU, 0 }, // Alt down
{ VK_SHIFT, 0 }, // Shift down
{ VK_TAB, 0 }, // Tab down
{ VK_TAB, KEYEVENTF_KEYUP }, // Tab up
{ VK_SHIFT, KEYEVENTF_KEYUP }, // Shift up
{ VK_MENU, KEYEVENTF_KEYUP }, // Alt up
{ 0xff, 0},
};
PushKeybd(key);
break;
}
case IDC_LOCKPC: // lock PC
{
KEYEVENT key[] = {
{ VK_LWIN, 0 }, // Win key down
{ 'L', 0 }, // L key down
{ 'L', KEYEVENTF_KEYUP }, // L key up
{ VK_LWIN, KEYEVENTF_KEYUP }, // Win key up
{ 0xff,0 },
};
PushKeybd(key);
break;
}
case IDC_MONOFF: // monitor off
SendMessage(GetDesktopWindow(), WM_SYSCOMMAND,
SC_MONITORPOWER, 2);
break;
}
// commands of task bar
if(400 < id && id <= 510)
{
HWND hwndBar = GetTaskbarWindow();
if(hwndBar)
PostMessage(hwndBar, WM_COMMAND, id, 0);
}
// open file written in tcmenu.txt
else if(id < 100) ContextMenuCommand(hwnd, id); // menu.c
}
/*------------------------------------------------
processing command string
--------------------------------------------------*/
BOOL ExecCommandString(HWND hwnd, const char *command)
{
char cmdstr[21];
char option[MAX_PATH];
const char *p;
int i;
if(*command == 0) return FALSE;
p = command;
for(i = 0; i < 20 && *p; i++)
{
if(*p == ' ') break;
cmdstr[i] = *p++;
}
cmdstr[i] = 0;
while(*p == ' ') p++;
for(i = 0; i < MAX_PATH-1 && *p; i++)
option[i] = *p++;
option[i] = 0;
if(strcmp(cmdstr, "clip") == 0)
{
if(option[0])
CopyToClipBoard(hwnd, option);
else if(g_hwndClock)
PostMessage(g_hwndClock, CLOCKM_COPY, 0, 0);
return FALSE;
}
else if(strcmp(cmdstr, "sntp") == 0)
{
strcpy(cmdstr, "tcsntp.exe /silent");
if(strcmp(option, "ras") == 0) strcat(cmdstr, " /ras");
ExecFile(hwnd, cmdstr);
// SNTPCommand(hwnd, option);
return FALSE;
}
else if(strcmp(cmdstr, "post") == 0)
{
PostMessageCommand(option);
return FALSE;
}
else if(command[0] == '>') {
const char *p = command;
p++;
while(*p == ' ') p++;
ExecHiddenCmdPrompt(hwnd, p);
return FALSE;
}
else
return ExecFile(hwnd, command); // common/utl.c
}
/*------------------------------------------------
make tcdll.tclock to copy string to clipboard
--------------------------------------------------*/
void CopyToClipBoard(HWND hwnd, const char *pfmt)
{
wchar_t ws[MAX_PATH];
if(g_hwndClock)
{
MultiByteToWideChar(CP_ACP, 0, pfmt, -1, ws, MAX_PATH-1);
SendStringToOtherW(g_hwndClock, hwnd, ws, COPYDATA_COPY);
}
}
/*------------------------------------------------
show help page
--------------------------------------------------*/
void ShowHelp(HWND hwnd)
{
char helpurl[MAX_PATH];
GetMyRegStr(NULL, "HelpURL", helpurl, MAX_PATH, "");
if(helpurl[0] == 0)
{
char langfile[MAX_PATH];
FindFileWithLangCode(langfile, GetUserDefaultLangID(), TCLANGTXT);
if(GetPrivateProfileString("Main", "HelpURL", "", helpurl,
MAX_PATH, langfile) == 0) return;
}
ShellExecute(hwnd, NULL, helpurl, NULL, "", SW_SHOW);
}
/*------------------------------------------------
post message to window
option : "WindowClass [WindowTitle] message [wParam] [lParam]"
--------------------------------------------------*/
void PostMessageCommand(const char *option)
{
char param2[81], param3[11], param4[11], param5[11];
char wndclass[81], title[81];
int message = 0, wParam = 0, lParam = 0;
HWND hwnd;
parsespace(wndclass, option, 0, 81);
parsespace(param2, option, 1, 81);
parsespace(param3, option, 2, 11);
parsespace(param4, option, 3, 11);
parsespace(param5, option, 4, 11);
if(isdigitstr(param2))
{
title[0] = 0;
message = atoi(param2);
if(param3[0]) wParam = atoi(param3);
if(param4[0]) lParam = atoi(param4);
}
else
{
strcpy(title, param2);
if(param3[0]) message = atoi(param3);
if(param4[0]) wParam = atoi(param4);
if(param5[0]) lParam = atoi(param5);
}
if(wndclass[0] == 0 && title[0] == 0) return;
if(message == 0) return;
hwnd = FindWindow(wndclass[0] ? wndclass : NULL,
title[0] ? title : NULL);
if(hwnd)
PostMessage(hwnd, message, wParam, lParam);
}
/*------------------------------------------------
execute cmd.exe /c ... , hiding prompt window
--------------------------------------------------*/
void ExecHiddenCmdPrompt(HWND hwnd, const char *str)
{
SHELLEXECUTEINFO sei;
char *param;
if(!(g_winver&WINNT)) return;
param = malloc(strlen(str) + 4);
strcpy(param, "/c ");
strcat(param, str);
memset(&sei,0,sizeof(sei));
sei.cbSize = sizeof(sei);
sei.nShow = SW_HIDE;
sei.lpFile = "cmd.exe";
sei.lpDirectory = g_mydir;
sei.lpParameters = param;
ShellExecuteEx(&sei);
free(param);
}
/*------------------------------------------------
send key action to Windows
--------------------------------------------------*/
void PushKeybd(LPKEYEVENT lpkey)
{
while(lpkey->key != 0xff)
{
keybd_event(lpkey->key,
(BYTE)MapVirtualKey(lpkey->key,0), lpkey->flag, 0);
lpkey++;
}
}
/*------------------------------------------------
Kyu!
--------------------------------------------------*/
BOOL CALLBACK doKyu(HWND hwnd, long height)
{
RECT rc;
GetWindowRect(hwnd, &rc);
if(!IsZoomed(hwnd) && IsWindowVisible(hwnd) && (rc.top < height))
SetWindowPos(hwnd, NULL, rc.left, height, 0, 0,
SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
return TRUE;
}